package org.hw.base;

import java.util.*;

/**
* 递归重要规则
1）执行一个方法时，就创建一个新的受保护的独立空间（栈空间）
2）方法的局部变量是独立的，不会互相影响
3）如果方法中使用的是引用类型的变量（比如数组，对象）就会共享该引用类型的数据
4）递归必须向递归条件逼近，否则就是无限递归
5）当一个执行完毕或者遇到return时就会返回，遵守谁调用，就将结果返回给谁
6）递归方法之前的代码在入栈操作时执行，递归方法之后的代码在出栈操作时执行，无论是入栈还是出栈操作，他们引用的变量在当前方法都是相等的。
*/
public class RecursionStart {
   public static void main(String []args) {
      printLevel(5);
   }

   public static void printLevel(int n){

     /*栈方法局部变量，每个栈方法相互不影响*/
     boolean isDouble=false;

     /*入栈结束开始出栈条件，也就是递归返回条件*/
     if(n<0) {
       System.out.println("入栈结束，开始出栈 "+n);
       return ;
     }

     /*****************************1、入栈执行的操作*****************************/
     System.out.println("递归入栈 "+n);
     if(n%2==0){
       isDouble=true;
     }

     if(isDouble){
       System.out.println("偶数");
     }
     if(!isDouble){
       System.out.println("奇数");
     }
     /*****************************1、入栈执行的操作*****************************/

     /*****************************2、递归调用，压栈*****************************/
     printLevel(n-1);
     /*****************************2、递归调用，压栈*****************************/

     /*****************************3、出栈执行的操作*****************************/
     System.out.println("递归出栈 "+n);
     if(isDouble){
       System.out.println("偶数");
     }
     if(!isDouble){
       System.out.println("奇数");
     }
     /*****************************3、出栈执行的操作*****************************/
   }
}